class V1::BookmarkAPI < Grape::API

  before do
    authenticate_user!
  end

  desc '获取所有的书签和频道信息'
  resources :bookmarks do
    #返回当前用户的所有书签及对应的频道分类
    get do
      present current_user.bookmarks, with: V1::Entities::Bookmark
    end

    desc '同步书签和频道数据'
    post 'sync' do
      #要求传入的必须是json格式的数据包。要求传入两个数据包
      # 第一个是channels,代表频道数据的操作，这个数据是个数组，每个数组元素都是一个hash，每个hash包含pre_name,name,operate两个元素，第一个是频道名，第二个是操作（新增，修改，删除）
      # 第二个是bookmarks,代表书签操作。这个数据一个数组，其每个元素都是一个hash，hash包含4个元素：name,url,image,channel,operate分别代表书签名称、地址、自定义图像、频道名、操作（新增，修改，删除）
      #对频道和书签表的验证：同一用户的同一频道，不能存在同一个url的书签，对同一用户，不能存在名称相同的频道,频道名称不能为空和空格
      status 200
      user_id=current_user.id

      channels_operate=JSON.parse(request.headers['Channels'])
      bookmarks_operate=JSON.parse(request.headers['Bookmarks'])
      begin
        #先更新频道信息
        channels_operate.each do |item|
          case item['operate']
            when 'add'
              Channel.create!(name:item['name'],user_id:user_id)
            when 'modify'
              channel=Channel.find_by(name:item['pre_name'],user_id:user_id)
              channel.update!(name:item['name']) unless channel.nil?
            when 'delete'
              channel=Channel.find_by(name:item['pre_name'],user_id:user_id)
              channel.destroy! unless channel.nil?
          end
        end
        #再更新书签信息
        bookmarks_operate.each do |item|
          #查找书签的频道，如果找到了，记录频ID，未找到或item['channel']为空，则让频道ID为-1
          channel=Channel.find_by(name:item['channel'],user_id:user_id)
          channel_id=channel.nil? || item['channel']=='' ? -1 : channel.id
          #若为新建操作，则直接新建一个，否则，按照频道、地址、用户ID来查找channel,找到了，就执行操作，若没找到，不执行任何操作。
          #当用户将一个书签从一个频道移动到另一个频道，那么，相当于，原来的频将书签删除，现在的频道新增，而并不是修改了书签的频道信息。修改书签，只是针对书签的名称、自定义图片的修改。
          #前端在同步完成后，要将相关操作历史清空。
          case item['operate']
            when 'add'
              Bookmark.create!(name:item['name'],channel_id:channel_id,user_id:user_id,url:item['url'],image:item['image'])
            when 'modify'
              bookmark=Bookmark.find_by(channel_id:channel_id,user_id:user_id,url:item['url'])
              bookmark.update!(name:item['name'],image:item['image']) unless bookmark.nil?
            when 'delete'
              bookmark=Bookmark.find_by(channel_id:channel_id,user_id:user_id,url:item['url'])
              bookmark.destroy! unless bookmark.nil?
          end
        end
        present current_user.bookmarks, with: V1::Entities::Bookmark
      rescue Exception => e
        error!(e.message, 401)
      end

    end
  end

end